const fs = require('fs')
const path = require('path')
const util = require('util')

// 定义根目录和dist文件夹路径
const rootDir = process.cwd()
const distDir = path.join(rootDir, 'dist')
const manifestPath = path.join(rootDir, 'dist/manifest.json')
const packagesDir = path.join(distDir, 'packages')
const cssDir = path.join(packagesDir, 'css')
const jsDir = path.join(packagesDir, 'js')
const popupMainJsPath = path.join(
    distDir,
    'contentScript/default_popup/main.js',
)

// 保存原始的 console.log 方法
const originalLog = console.log

console.log = function (...args) {
    const colorCode = '\x1b[38;2;103;194;58m' // #4B70F5 的 ANSI 转义码
    const resetCode = '\x1b[0m' // 重置颜色的 ANSI 转义码

    const formatArg = (arg) => {
        if (typeof arg === 'object') {
            return colorCode + util.inspect(arg, { depth: null }) + resetCode
        } else {
            return colorCode + arg + resetCode
        }
    }

    const formattedArgs = args.map(formatArg)

    originalLog(...formattedArgs)
    originalLog(
        '------------------------------------------------------------------------------------------------------------',
    )
}

// 获取dist文件夹下的所有CSS文件名
function getCssFiles() {
    return fs.readdirSync(distDir).filter((file) => file.endsWith('.css'))
}

// 获取dist文件夹下所有非background.js的JavaScript文件
function getJsFiles() {
    return fs
        .readdirSync(distDir)
        .filter((file) => file.endsWith('.js') && file !== 'background.js')
}

// 更新manifest.json文件中的content_scripts对象
function updateManifest(cssFiles) {
    const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf-8'))

    // 确保content_scripts存在
    if (!manifest.content_scripts) {
        manifest.content_scripts = []
    }

    // 遍历content_scripts并更新css数组
    manifest.content_scripts.forEach((script) => {
        if (!script.css) {
            script.css = []
        }
        cssFiles.forEach((cssFile) => {
            if (!script.css.includes(cssFile)) {
                script.css.push(`packages/css/${cssFile}`)
            }
        })
    })

    // 写回manifest.json文件
    fs.writeFileSync(manifestPath, JSON.stringify(manifest, null, 4), 'utf-8')
}

function updatePopupMain(jsFiles) {
    let mainJsContent = fs.readFileSync(popupMainJsPath, 'utf-8')

    // 遍历content_scripts并更新css数组
    jsFiles.forEach((jsFile) => {
        if (mainJsContent.includes(jsFile)) {
            mainJsContent = mainJsContent.replace(
                jsFile,
                `packages/js/${jsFile}`,
            )
            fs.writeFileSync(popupMainJsPath, mainJsContent, 'utf-8')
            console.log(
                `找到了${jsFile}，dist/contentScript/default_popup/main.js已更新`,
            )
        }
    })
}

// 创建packages文件夹及其子文件夹
function createPackagesDirs() {
    if (!fs.existsSync(packagesDir)) {
        fs.mkdirSync(packagesDir)
    }
    if (!fs.existsSync(cssDir)) {
        fs.mkdirSync(cssDir)
    }
    if (!fs.existsSync(jsDir)) {
        fs.mkdirSync(jsDir)
    }
}

// 移动文件到指定的目录
function moveFiles(cssFiles, jsFiles) {
    cssFiles.forEach((file) => {
        const srcPath = path.join(distDir, file)
        const destPath = path.join(cssDir, file)
        fs.renameSync(srcPath, destPath)
    })

    jsFiles.forEach((file) => {
        const srcPath = path.join(distDir, file)
        const destPath = path.join(jsDir, file)
        fs.renameSync(srcPath, destPath)
    })
}

// 主函数
function main() {
    createPackagesDirs()

    const cssFiles = getCssFiles()
    const jsFiles = getJsFiles()
    if (cssFiles.length === 0) {
        console.log('没有找到CSS文件。')
    } else {
        console.log('找到的CSS文件：', cssFiles)
    }
    if (jsFiles.length === 0) {
        console.log('没有找到JavaScript文件（除了background.js）。')
    } else {
        console.log('找到的JavaScript文件：', jsFiles)
    }

    updateManifest(cssFiles)
    moveFiles(cssFiles, jsFiles)
    updatePopupMain(jsFiles)

    console.log(
        'manifest.json已更新，文件已移动至packages/css和packages/js中。',
    )
}

// 执行主函数
main()
